#ifndef __HK32C03x_HAL_CONFIG_H__
#define __HK32C03x_HAL_CONFIG_H__

#include <stdint.h>

#define CONFIG_PAGE_NUM         (240)
#define CONFIG_PAGE_SIZE        (256)
#define CONFIG_PAGE_BASE_ADDR   (0x08000000)

#define PARAMS_NAME_LEN         (10)
#define PARAMS_MAX_NUM		    (14)

#pragma pack(4)
typedef struct params_node {
    uint8_t node_index;
    uint8_t param_name[PARAMS_NAME_LEN];
    uint32_t value;
}params_node_t;

typedef struct params_manager {
    uint8_t node_counts;
    params_node_t params[PARAMS_MAX_NUM];
}params_manager_t;
#pragma pack()

typedef enum {
    PARAMS_INT = 0,
    PARAMS_STRING,
    PARAMS_FLOAT,
    PARAMS_BOOL
}PARAMS_TYPE_E;

#define CONFIG_OK					(0)
#define CONFIG_READ_PARAMS_NUM_ERR	(-1)
#define CONFIG_PARAMS_FULL 			(-2)
#define CONFIG_PARAMS_NAME_ERR		(-3)
#define CONFIG_PARAMS_ID_ERR		(-4)
#define CONFIG_PARAMS_IS_NOT_CHANGE	(-5)
#define CONFIG_PARAMS_NOT_FOUND     (-6)
#define CONFIG_PARAMS_INVALIB		(-7)

/**
 * @brief 配置信息初始化
 ***/
void config_params_init(void);

/**
 * @brief 清空参数配置
 ***/
void config_params_clear(void);

/**
 * @brief 读取配置信息
 * @return 返回参数配置信息个数
 ***/
int config_read_params(void);

/**
 * @brief 添加配置信息
 * @param param_name [in] 参数名称
 * @param val [in] 参数配置value
 * @return 添加成功的索引，错误为Error num
 ***/
int config_params_add(uint8_t *param_name,uint32_t val);

/**
 * @brief 设置配置参数信息
 * @param params_id [in] 参数ID
 * @param val [in] 参数配置value
 * @return 0:成功 错误:Error num
 ***/
int config_params_set_val(uint8_t params_id,uint32_t val);

/**
 * @brief 刷新参数表信息
 * @return 0:成功 错误:Error num
 ***/
int config_params_reflash(void);

/**
 * @brief 通过参数名字获得参数ID
 * @brief name [in] 参数名字
 * @return 返回值参数ID 非负为正确
 ***/
int8_t get_config_id_by_name(char *name);

/**
 * @brief 通过参数名字获得参数值
 * @brief name [in] 参数名字
 * @brief val [out] 参数值
 * @return 返回非0 异常
 ***/
int get_config_val_by_name(char *name,uint32_t *val);

/**
 * @brief 遍历参数列表
 * @return 非负为正确
 ***/
int config_desplay_params(void);

//定义全局参数配置表
extern params_manager_t g_config_;

#endif //__HK32C03x_HAL_CONFIG_H__
